{
 "metadata": {
  "name": "",
  "signature": "sha256:06e685d787fd67653449215097f6967f77d3fbae6a8a5b36be984f4e4de57df7"
 },
 "nbformat": 3,
 "nbformat_minor": 0,
 "worksheets": [
  {
   "cells": [
    {
     "cell_type": "heading",
     "level": 1,
     "metadata": {},
     "source": [
      "Basic"
     ]
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Functional and its minimum"
     ]
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "Functional"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "In short, a functional is a ***function*** that its input is a function(s) and ouput is a scalar.\n",
      "\n",
      "For example, consider the famous problem of \"brachistochrone curve\" (1696, Johann Bernoulli):\n",
      "\n",
      "> If a point-like body with zero initial velocity is going to move from a given point $A$ to another point $B$, and this movement is constrained by a certain path, what is the path that makes the time of movement minimum? Assume no friction.\n",
      "\n",
      "There are infinite paths connecting $A$ and $B$ on the xy coordinate. Let us use a function $y = y(x)$ to describe these paths.  We are looking for a specific function $y(x)$ that match the specification of the problem.\n",
      "\n",
      "<img src=\"files/figs/brachistochrone.JPG\" alt=\"brachistochrone curve\" height=\"300\" width=\"300\">\n",
      "\n",
      "See the above figure and recall the knowledge of differential geometry, the velocity of an arbitrary point $P$ on the path is $v=ds/dt=\\sqrt{1+(y')^2}(dx/dt)$. And from the viewpoint of energy conservation, we have $0 = -mgy+\\frac{1}{2}mv^2$, i.e. $v=\\sqrt{2gy}$. Comparing the two different expressions of the velocity $v$, we can equalize them and get\n",
      "\n",
      "$$\n",
      "dt = \\sqrt{\\frac{1+(y')^2}{2gy}}dx\n",
      "$$\n",
      "\n",
      "Integrate the above equation from $t=0$ to $t=t_{AB}$ and from $x=0$ to $x=x_B$, we then obtain our first functional:\n",
      "\n",
      "$$\n",
      "J(y) = t_{AB} = \\int_0^{x_B}{\\sqrt \\frac{1+(y')^2}{2gy}} dx\n",
      "$$\n",
      "\n",
      "$J(y)$, or $t_{AB}$, is the time it takes to move from $A$ to $B$ along some certain path $y(x)$. From the above equation, it is apparently a function of $y(x)$, that is, its input is the function $y(x)$. Once we know the exact detail of the function $y(x)$, we can then evaluate the integral at the right hand side. And finally the output of $J(y)$ is a scalar. So according to the definition, $J(y)$ is indeed a functional!!"
     ]
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "Maximum and minimum of a functional"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "What's the big deal of the functional? \n",
      "\n",
      "We can see that the brachistochrone curve problem is in fact looking for the minimum of the traveling time $t_{AB}$, i.e. $J(y)$. Recall the basic calculus, we can find out the minimum of a function through its derivatives. It is the same when we deal with the functional. So functional provides us a way to find out the answers of many problems. It also provides a start point of the finite element method. We will show you that solving some of PDEs is equal to looking for the minimums of some functionals."
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Consider a differential equation $Lu=f$, which is valid inside a domain $\\Omega$. $L$ is called a **differential operator**. For example, in this second order ODE\n",
      "\n",
      "$$\n",
      "\\left\\{\n",
      "\\begin{array}{l}\n",
      "-\\frac{d}{dx}\\left(p\\frac{du}{dx}\\right)+qu=f \\\\\n",
      "u(a)=\\alpha,\\ \\ u'(b)+\\sigma u(b)=\\beta\n",
      "\\end{array}\n",
      "\\right.,\\ \n",
      "\\begin{array}{l}\n",
      "x \\in (a, b); \\\\\n",
      "\\ p\\ ,\\ u,\\ q,\\ f\\text{ are functions of x};\\\\\n",
      "\\sigma,\\ \\alpha,\\ \\beta\\text{ are constants}\n",
      "\\end{array}\n",
      "$$\n",
      "\n",
      "the differential operator is $L=-\\frac{d}{dx}\\left(p\\frac{d}{dx}\\right)+q$. \n",
      "  \n",
      "Let's skip a lot of mathematical terminologies and directly point out an important theorem:\n",
      "> If $\\int_\\Omega Lu \\times u d\\Omega = 0$ is valid only when $u=0$, the solution to $Lu=f$ is also the minimum of the functional\n",
      "\n",
      "> $$ J(u) = \\frac{1}{2} \\int_\\Omega Lu\\times u d\\Omega - \\int_\\Omega f \\times u d\\Omega$$\n",
      "\n",
      "This means that when we are looking for the solution to a differential equation, we can also try to find the minimum of the above functional. Take the above differential equation as an example. After we substitute the equation and the boundary conditions into the integral in $J(u)$, we can find that the solution of the above equation is also the minimum of functional\n",
      "\n",
      "$$\n",
      "J(u) = \\frac{1}{2}a(u, u) - F(u)\n",
      "$$\n",
      "\n",
      "where functional $a$ and $F$ are defined as\n",
      "\n",
      "$$\n",
      "\\left\\{\n",
      "\\begin{array}{l}\n",
      "a(g_1(x), g_2(x))=\\int_a^b [p(x)g_1'(x)g_2'(x)+q(x)g_1(x)g_2(x)]dx+\\sigma p(b)g_1(b)g_2(b) \\\\\n",
      "F(g(x)) = \\int_a^b f(x)g(x)\\ dx + \\beta p(b)g(b)\n",
      "\\end{array}\n",
      "\\right.\n",
      "$$\n",
      "\n",
      "We know we can find the minimum of the functional instead of solving the differential equation directly, but how do we find the minimum of a functional in practice? That why we'll introduce the ***Ritz method*** in the next section."
     ]
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "The Ritz method"
     ]
    },
    {
     "cell_type": "heading",
     "level": 5,
     "metadata": {},
     "source": [
      "Concept"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "Let $u_n(x)=\\psi_0(x)+\\sum_{i=1}^{n}{\\alpha_i \\psi_i(x)}$ be an approximate solution to the exact solution $u(x)$. $\\psi_0$ to $\\psi_n$ are selected functions. For example, we can choose $\\sin(i\\pi x/n)$ as $\\psi_i(x)$. And $\\psi_0(x)$ must satisfy the same Dirichlet boundary values of the differential equation (for example, $\\psi_0(a)=\\alpha$ for the above example). $\\alpha_i$ are unknown coefficients, and we need to determine these unknown coefficients.\n",
      "\n",
      "Substitute the approximate solution $u_n$ into the functional $J(u)$, we will obtain\n",
      "\n",
      "$$\n",
      "J(u_n) = \\frac{1}{2}\\sum_{i=1}^n\\sum_{j=1}^n a(\\psi_i, \\psi_j)\\alpha_i\\alpha_j+\\sum_{i=1}^n a(\\psi_0, \\psi_i)\\alpha_i+\\frac{1}{2}a(\\psi_0,\\psi_0)-F(\\psi_0)-\\sum_{i=1}^n F(\\psi_i)\\alpha_i\n",
      "$$\n",
      "\n",
      "We said that when we want to find a minimum of a function, we use its derivatives. For example, if there is a pair of $x$ and $y$ that makes the value of function $G(x,y)$ minimal, then we can find out this pair of $x$ and $y$ through solving a system of equation: $\\frac{\\partial G}{\\partial x}=0$ and $\\frac{\\partial G}{\\partial y}=0$. For functional, it is the same. If there is a set of coefficients $\\alpha_1,\\ \\alpha_2\\dots\\alpha_n$ that makes the functional $J(u_n)$ minimal, we can obtain this set of coefficients through solving a system of equations composed of $\\frac{\\partial J(u_n)}{\\partial \\alpha_i}=0$, where $i=1\\text{ to }n$.\n",
      "\n",
      "Performing calculus on the above equation, and after getting through the pain of mathematical calculations, we now have the system of equations of the derivatives:\n",
      "\n",
      "$$\n",
      "\\frac{\\partial J(u_n)}{\\partial \\alpha_i}=\\sum_{j=1}^n a(\\psi_i, \\psi_j)\\alpha_j+a(\\psi_0, \\psi_i)-F(\\psi_i),\\ \\ \\ i=1\\text{ to }n\n",
      "$$\n",
      "\n",
      "Or we can also rewrite the above equation into a more familiar form, which we keep the unknowns on the left hand side and all others on the right hand side:\n",
      "\n",
      "$$\n",
      "\\sum_{j=1}^n a(\\psi_i, \\psi_j)\\alpha_j=F(\\psi_i)-a(\\psi_0, \\psi_i),\\ \\ \\ i=1\\text{ to }n\n",
      "$$\n",
      "\n",
      "There are $n$ unknowns, i.e. $\\alpha_1,\\ \\alpha_2,\\dots\\alpha_n$, and there are also $n$ equations in the above system of equations, so we can sovle the equations for our unknown coefficients now.\n",
      "\n",
      "After we obtain the set of coefficients $\\alpha_1,\\ \\alpha_2,\\dots\\alpha_n$,  $u_n(x)=\\psi_0(x)+\\sum_{i=1}^{n}{\\alpha_i \\psi_i(x)}$ now is function that can make the functional $J(u_n)$ minimal. In other words, it is the solution of the original differential equation (of course, it is just an approximate solution)."
     ]
    },
    {
     "cell_type": "heading",
     "level": 5,
     "metadata": {},
     "source": [
      "Example"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "<img src=\"files/figs/Ritz_example.jpg\">"
     ]
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Calculus of variations"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "I'm tired. So just show you the theorem.\n",
      "\n",
      "Recall the functional $J(u)$ for the 2nd-order ODE we used in the beginning. We rewrite the $J(u)$ from a general form into a special form with two functional $a(g_1(x), g_2(x))$ and $F(g(x))$. In fact, not only that ODE but also the functionals of other types of defferential equations can be rewritten to the form of $a(g_1(x), g_2(x))$ and $F(g(x))$. Of course, the detail of $a(g_1(x), g_2(x))$ and $F(g(x))$ are different from one differential equation to another equation.\n",
      "\n",
      "Utilizing the functional $a(g_1(x), g_2(x))$ and $F(g(x))$, finding the minimum of the functional $J(u)$ is equal to finding a suitable solution that satisfies\n",
      "\n",
      "$$\n",
      "a(u, v) = F(v)\n",
      "$$\n",
      "\n",
      "where $v$ is a selected function(s) that is/are at least 1st-order continuous. And functional $a$ and $F$ are derived from original definition of $J(u)$. For the case of the ODE we used at the beginning, $a(g_1(x), g_2(x))$ and $F(g(x))$ are again shown here:\n",
      "\n",
      "$$\n",
      "\\left\\{\n",
      "\\begin{array}{l}\n",
      "a(g_1(x), g_2(x))=\\int_a^b [p(x)g_1'(x)g_2'(x)+q(x)g_1(x)g_2(x)]dx+\\sigma p(b)g_1(b)g_2(b) \\\\\n",
      "F(g(x)) = \\int_a^b f(x)g(x)\\ dx + \\beta p(b)g(b)\n",
      "\\end{array}\n",
      "\\right.\n",
      "$$\n",
      "\n",
      "We said that the solution of a differential equation is the minimum of $J(u)$. And now we also know that the minimum of $J(u)$ will satisfy $a(u, v)=F(v)$. This means that we can also solve $a(u, v)=F(v)$ to find the solution of the original differential equation. A classical method to solve $a(u, v)=F(v)$ is the ***Galerkin method***.\n",
      "\n",
      "Before we introduce the galerkin method, we want to talk about the ***weighted residudal method*** first."
     ]
    },
    {
     "cell_type": "heading",
     "level": 2,
     "metadata": {},
     "source": [
      "Weight Residual Method"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "If the original differential equation is $Lu=f$, then we have\n",
      "\n",
      "$$\n",
      "\\int_\\Omega (Lu-f)v d\\Omega=0\n",
      "$$\n",
      "\n",
      "$v$ is again a selected functions. If the approximate solution of $u$ is named $u_n$, then we will obtain so-called weighted residual equation:\n",
      "\n",
      "$$\n",
      "\\int_\\Omega (Lu_n-f)v d\\Omega=0\n",
      "$$\n",
      "\n",
      "$Lu_n-f$ is the residual. So the meaning of the weighted residual equation is: we don't force the residual at every point in a discretized space to be zero; however, we hope the overall (summed) residual over the whole domain $\\Omega$ is zero after we multiply the residual by some certain weighting function $v$.\n",
      "\n",
      "If we split the weighted residual equation, we'll get\n",
      "\n",
      "$$\n",
      "\\int_\\Omega (Lu)v d\\Omega = \\int_\\Omega fv d\\Omega\n",
      "$$\n",
      "\n",
      "Of course we can simply let $a(u, v)=\\int_\\Omega (Lu)v d\\Omega$ and $F(v)=\\int_\\Omega fv d\\Omega$ and obtain a rough conclusion saying the weighted residual equation is equal to the variational equation we talked about in the previous section. But in fact, if we look closer to the $a(u,v)$ and $F(v)$ in the previous section, we can see that the boundary conditions are included in $a$ and $F$. However, in weighted residual equation, there is no information about the boundary condition. So they are not strictly equal.\n",
      "\n",
      "We can do some mathematical operations, such as integration by parts\uff0c to include the information of boundary conditions into the weighted residual equation. For example,\n",
      "\n",
      "$$\n",
      "\\left\\{\n",
      "\\begin{array}{l}\n",
      "-\\frac{d}{dx}\\left(p\\frac{du}{dx}\\right)+qu=f \\\\\n",
      "u(a)=0,\\ \\ u'(b)+\\sigma u(b)=0\n",
      "\\end{array}\n",
      "\\right.,\\ \n",
      "\\begin{array}{l}\n",
      "x \\in (a, b); \\\\\n",
      "\\ p\\ ,\\ u,\\ q,\\ f\\text{ are functions of x};\\\\\n",
      "\\sigma\\text{ is a constant}\n",
      "\\end{array}\n",
      "$$\n",
      "\n",
      "The weighted residual equation is\n",
      "$$\n",
      "\\int_a^b -\\frac{d}{dx}\\left(p\\frac{du}{dx}\\right)v+quv dx=\\int_a^b fv dx\n",
      "$$\n",
      "\n",
      "Integrate the first term by part, and substitute the boundary conditions into it, it becomes\n",
      "\n",
      "$$\n",
      "\\int_a^b (pu'v'+quv)dx+\\sigma p(b)u(b)v(b)=\\int_a^b fv dx\n",
      "$$\n",
      "\n",
      "or\n",
      "\n",
      "$$\n",
      "a(u, v) = F(v)\n",
      "$$\n",
      "where\n",
      "$$\n",
      "\\left\\{\n",
      "\\begin{array}{l}\n",
      "a(u,v)=\\int_a^b (pu'v'+quv)dx+\\sigma p(b)u(b)v(b) \\\\\n",
      "F(v)=\\int_a^b fv dx\n",
      "\\end{array}\n",
      "\\right.\n",
      "$$\n",
      "\n",
      "After we included the boundary conditions into the weighted residual equation like this, we then can say the weighted residual equation is equal to the variational equation in the previous section. \n",
      "\n",
      "The Galerkin method can also be applied here."
     ]
    },
    {
     "cell_type": "heading",
     "level": 3,
     "metadata": {},
     "source": [
      "The Galerkin method"
     ]
    },
    {
     "cell_type": "heading",
     "level": 5,
     "metadata": {},
     "source": [
      "Concept"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "$u_n(x)=\\psi_0(x)+\\sum_{i=1}^n{\\alpha_i\\psi_i(x)}$ is again the approximate solution here. Now we have to choose a proper $v$ function(s). In Galerkin method, we choose $n$ functions as our $v$, that is, $v_j=\\psi_j$, where $j=1\\text{ to }n$.\n",
      "\n",
      "Substituting $u_n$ and $v_j$ into $a(u,v)=F(v)$, we will get\n",
      "\n",
      "$$\n",
      "\\sum_{i=1}^n{a(\\psi_i,\\psi_j)\\alpha_i}=F(\\psi_j)-a(\\psi_0, \\psi_j)\n",
      "$$\n",
      "\n",
      "***It is the same as what we finally obtained from the Ritz method!!***\n",
      "\n",
      "Though they start from different viewpoints, the Galerkin method is actually equivalent to the Ritz method. That's why we often heard people saying Galerkin-Ritz method."
     ]
    },
    {
     "cell_type": "heading",
     "level": 5,
     "metadata": {},
     "source": [
      "Example"
     ]
    },
    {
     "cell_type": "markdown",
     "metadata": {},
     "source": [
      "<img src=\"files/figs/Galerkin_example.jpg\">"
     ]
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "import numpy\n",
      "from matplotlib import pyplot\n",
      "% matplotlib inline\n",
      "\n",
      "def u_exact(x):\n",
      "    return 0.5 + (numpy.exp(2 * x) - numpy.exp(x)) / (2 * numpy.exp(2) - numpy.exp(1))\n",
      "\n",
      "def un(n, apa, x):\n",
      "    j = numpy.arange(1, n+1, dtype=numpy.float)\n",
      "    return 0.5 + numpy.sum(apa*(x**j))\n",
      "\n",
      "n = 6\n",
      "idx = numpy.linspace(1., n, n, dtype=numpy.float)\n",
      "idx_i, idx_j = numpy.meshgrid(idx, idx)\n",
      "\n",
      "A = idx_i * idx_j / (idx_i + idx_j - 1) + \\\n",
      "    3 * idx_i / (idx_i + idx_j) - \\\n",
      "    2 / (idx_i + idx_j + 1)\n",
      "\n",
      "b = numpy.ones(n)\n",
      "\n",
      "apa = numpy.linalg.solve(A, b)\n",
      "\n",
      "x = numpy.linspace(0., 1., 101)\n",
      "u_fem = numpy.array([un(n, apa, x[i]) for i in range(101)])\n",
      "u_anl = u_exact(x)\n",
      "\n",
      "pyplot.plot(x, numpy.abs(u_anl - u_fem), 'k-', lw=2)\n",
      "pyplot.xlabel('x')\n",
      "pyplot.ylabel('absolute error');"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "metadata": {},
       "output_type": "display_data",
       "png": "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\n",
       "text": [
        "<matplotlib.figure.Figure at 0x7f34c408e450>"
       ]
      }
     ],
     "prompt_number": 1
    },
    {
     "cell_type": "code",
     "collapsed": false,
     "input": [
      "from IPython.core.display import HTML\n",
      "css_file = '../css/fem.css'\n",
      "HTML(open(css_file, \"r\").read())"
     ],
     "language": "python",
     "metadata": {},
     "outputs": [
      {
       "html": [
        "<link href='http://fonts.googleapis.com/css?family=Alegreya+Sans:100,300,400,500,700,800,900,100italic,300italic,400italic,500italic,700italic,800italic,900italic' rel='stylesheet' type='text/css'>\n",
        "<link href='http://fonts.googleapis.com/css?family=Arvo:400,700,400italic' rel='stylesheet' type='text/css'>\n",
        "<link href='http://fonts.googleapis.com/css?family=PT+Mono' rel='stylesheet' type='text/css'>\n",
        "<link href='http://fonts.googleapis.com/css?family=Shadows+Into+Light' rel='stylesheet' type='text/css'>\n",
        "<link href='http://fonts.googleapis.com/css?family=Nixie+One' rel='stylesheet' type='text/css'>\n",
        "<style>\n",
        "\n",
        "@font-face {\n",
        "    font-family: \"Computer Modern\";\n",
        "    src: url('http://mirrors.ctan.org/fonts/cm-unicode/fonts/otf/cmunss.otf');\n",
        "}\n",
        "\n",
        "#notebook_panel { /* main background */\n",
        "    background: rgb(245,245,245);\n",
        "}\n",
        "\n",
        "div.cell { /* set cell width */\n",
        "    width: 960px;\n",
        "}\n",
        "\n",
        "div #notebook { /* centre the content */\n",
        "    background: #fff; /* white background for content */\n",
        "    width: 1100px;\n",
        "    margin: auto;\n",
        "    padding-left: 0em;\n",
        "}\n",
        "\n",
        "#notebook li { /* More space between bullet points */\n",
        "margin-top:0.8em;\n",
        "}\n",
        "\n",
        "/* draw border around running cells */\n",
        "div.cell.border-box-sizing.code_cell.running { \n",
        "    border: 1px solid #111;\n",
        "}\n",
        "\n",
        "/* Put a solid color box around each cell and its output, visually linking them*/\n",
        "div.cell.code_cell {\n",
        "    background-color: rgb(256,256,256); \n",
        "    border-radius: 0px; \n",
        "    padding: 0.5em;\n",
        "    margin-left:1em;\n",
        "    margin-top: 1em;\n",
        "}\n",
        "\n",
        "div.text_cell_render{\n",
        "    font-family: 'Alegreya Sans' sans-serif;\n",
        "    line-height: 140%;\n",
        "    font-size: 125%;\n",
        "    font-weight: 400;\n",
        "    width:960px;\n",
        "    margin-left:auto;\n",
        "    margin-right:auto;\n",
        "}\n",
        "\n",
        "\n",
        "/* Formatting for header cells */\n",
        ".text_cell_render h1 {\n",
        "    font-family: 'Nixie One', serif;\n",
        "    font-style:regular;\n",
        "    font-weight: 400;    \n",
        "    font-size: 45pt;\n",
        "    line-height: 50%;\n",
        "    color: rgb(0,51,102);\n",
        "    margin-bottom: 0.5em;\n",
        "    margin-top: 0.5em;\n",
        "    display: block;\n",
        "}\t\n",
        ".text_cell_render h2 {\n",
        "    font-family: 'Nixie One', serif;\n",
        "    font-weight: 400;\n",
        "    font-size: 30pt;\n",
        "    line-height: 50%;\n",
        "    color: rgb(0,51,102);\n",
        "    margin-bottom: 0.1em;\n",
        "    margin-top: 0.3em;\n",
        "    display: block;\n",
        "}\t\n",
        "\n",
        ".text_cell_render h3 {\n",
        "    font-family: 'Nixie One', serif;\n",
        "    margin-top:16px;\n",
        "\tfont-size: 22pt;\n",
        "    font-weight: 600;\n",
        "    margin-bottom: 3px;\n",
        "    font-style: regular;\n",
        "    color: rgb(102,102,0);\n",
        "}\n",
        "\n",
        ".text_cell_render h4 {    /*Use this for captions*/\n",
        "    font-family: 'Nixie One', serif;\n",
        "    font-size: 14pt;\n",
        "    text-align: center;\n",
        "    margin-top: 0em;\n",
        "    margin-bottom: 2em;\n",
        "    font-style: regular;\n",
        "}\n",
        "\n",
        ".text_cell_render h5 {  /*Use this for small titles*/\n",
        "    font-family: 'Nixie One', sans-serif;\n",
        "    font-weight: 400;\n",
        "    font-size: 16pt;\n",
        "    color: rgb(163,0,0);\n",
        "    font-style: italic;\n",
        "    margin-bottom: .1em;\n",
        "    margin-top: 0.8em;\n",
        "    display: block;\n",
        "}\n",
        "\n",
        ".text_cell_render h6 { /*use this for copyright note*/\n",
        "    font-family: 'PT Mono', sans-serif;\n",
        "    font-weight: 300;\n",
        "    font-size: 9pt;\n",
        "    line-height: 100%;\n",
        "    color: grey;\n",
        "    margin-bottom: 1px;\n",
        "    margin-top: 1px;\n",
        "}\n",
        "\n",
        ".CodeMirror{\n",
        "        font-family: \"PT Mono\";\n",
        "        font-size: 90%;\n",
        "}\n",
        "\n",
        "</style>\n",
        "<script>\n",
        "    MathJax.Hub.Config({\n",
        "                        TeX: {\n",
        "                           extensions: [\"AMSmath.js\"],\n",
        "                           equationNumbers: { autoNumber: \"AMS\", useLabelIds: true}\n",
        "                           },\n",
        "                tex2jax: {\n",
        "                    inlineMath: [ ['$','$'], [\"\\\\(\",\"\\\\)\"] ],\n",
        "                    displayMath: [ ['$$','$$'], [\"\\\\[\",\"\\\\]\"] ]\n",
        "                },\n",
        "                displayAlign: 'center', // Change this to 'center' to center equations.\n",
        "                \"HTML-CSS\": {\n",
        "                    styles: {'.MathJax_Display': {\"margin\": 0}}\n",
        "                }\n",
        "        });\n",
        "</script>\n"
       ],
       "metadata": {},
       "output_type": "pyout",
       "prompt_number": 2,
       "text": [
        "<IPython.core.display.HTML at 0x7fb880421210>"
       ]
      }
     ],
     "prompt_number": 2
    }
   ],
   "metadata": {}
  }
 ]
}